# Система бронирования билетов в социальном кинотеатре

### Что используется
**База данных:** h2 в памяти. Живёт только пока запущено приложение. (Исключительно для тестирования системы).
Доступ к базе можно получить по ссылке http://localhost:8080/h2-console

### Что умеет
**Создавать, удалять, редактировать:**
* Кинозалы
* Фильмы
* Сеансы
* Бронировать места на сеанс
* Категории пользователей

1. Показывать историю сеансов и брони всех сразу или для конкретного пользователя.
2. Следить за состоянием свободных мест в зале на основе состояния брони.

### Тестовые данные
Инициализируются из файла data-h2.sql в каталоге resources

### Методы
* [/api/v1/bookings](/api/v1/bookings) - работа с бронью
* [/api/v1/categories](/api/v1/categories) - работа с категориями пользователей
* [/api/v1/halls](/api/v1/halls) - работа с кинозалами
* [/api/v1/movie-sessions](/api/v1/movie-sessions) - работа с сеансами
* [/api/v1/users](/api/v1/users) - получение истории посещения сеансов и брони пользователя

### Пример работы на тестовых данных
POST http://localhost:8080/api/v1/movie-sessions?movieId=3&hallId=2 - созда
Content-type: application/json


POST http://localhost:8080/api/v1/bookings?movieSessionId=1&userId=2 - забронирует место на сеанс для пользователя Петя на киносеанс в зелёном зале на фильм From Dusk Till Dawn

PUT http://localhost:8080/api/v1/bookings/1/pay - вызывается когда бронь оплачена. Резерв снимается, количество мест в зале уменьшается на 1. Сеанс для которого бронь оплачена попадет в выборку истории посещённых сеансов пользователя.

POST http://localhost:8080/api/v1/movie-sessions?movieId=3&hallId=2 
Content-Type: application/json
{
  "startedAt": "25-05-2020 21:00",
  "endedAt": "25-05-2020 22:30"
}
Создаст новый киносеанс на 25 мая 2020 года, начало сеанса в 21:00 и окончание в 22:30 в VIP зал, на фильм Афоня. После этого можно бронировать места.

### Что не реализовано

* Места в кинозале
* Задача максимизации прибыли (work in progress)
* Проверка на возможность брони
